package com.dcm360.report.alarm.controller;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.dcm360.report.alarm.domain.Alarm;
import com.dcm360.report.alarm.mapper.AlarmMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/hello")
public class FillExcelController {



    @Autowired
    AlarmMapper alarmMapper;

    /**
     * 根据id导出Excel模板
     * @param id
     * @param response
     */
    @GetMapping("down")
    public void exportExcelTemplateById(String id, HttpServletResponse response) throws IOException {
        // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 {} 代表普通变量 {.} 代表是list的变量
        //1.创建excel模板
        String path = this.getClass().getClassLoader().getResource("templates/aa.xls").getPath();
        System.out.println("path========================"+path+"======================");

        //2.导出直接浏览器下载
        response.reset();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        //设置要导出的文件的名字、这里URLEncoder.encode可以防止中文乱码
        String fileName = "粮食购销领域腐败问题专项整治自查自纠问题统计表" + System.currentTimeMillis()+".xls";
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
        OutputStream outputStream = response.getOutputStream();

        ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(path).build();

        //3.填充赋值、查询需要导出的数据
        List<Alarm> alarms = alarmMapper.selectAlarmList(new Alarm());
        alarms = alarms.stream().limit(10).collect(Collectors.toList());

        for(Alarm alarm : alarms){
            alarm.setUrl(new URL("http://192.168.100.244:8000/jk/room/5b88cf6863b911ec9600525400db17dc/192.168.100.243/02bae81ea4fe11ecb5b3525400db17dc/ins/0044ab4d4c7f46b8b9b915c3a3288045/1/A5--erweima1_0_6_1647940274545.jpg"));
        }
        // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行，然后下面的数据往后移动。默认 是false，会直接使用下一行，如果没有则创建。
        // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了，所以慎用
        // 简单的说 如果你的模板有list,且list不是最后一行，下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
        // 如果数据量大 list不是最后一行 参照下一个
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        excelWriter.fill(alarms, fillConfig, writeSheet);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", "2019年10月9日13:28:28");
        map.put("total", 1000);
        map.put("image", alarms.get(0).getUrl());
        map.put("lxfs", 1000);
        excelWriter.fill(map, writeSheet);
        excelWriter.finish();
    }



}
